//
//  hashdb.h
//  hashtable
//
//  Created by chenyh on 2021/1/26.
//

#ifndef hashdb_h
#define hashdb_h

#include <stdio.h>
#include "slist.h"




/*哈希函数要尽可能确保记录均分地分布在哈希表的各个表象中。
对于不同的数据，用户可能选择不同的哈希函数，因此哈希函数应该
 由用户指定。基于此，在哈希表结构体中新增一个函数指针，用于
 用于自定义的哈希函数
 */
typedef unsigned int (*hash_func_t)(const void *key); //定义哈希函数类型

 struct _hash_db {
    slist_head_t    *p_head;    //指向数组首地址
    unsigned int    size;       //数组成员数
    unsigned int    value_len;  //一条记录的长度
    unsigned int    key_len;    //关键字长度
    hash_func_t     pfn_hash;   //哈希函数
};
typedef struct _hash_db hash_db_t;

int hash_db_init(
hash_db_t *p_hash,      //指向哈希表实例的指针
unsigned int size,      //哈希表大小
unsigned int key_len,   //关键字长度
unsigned int value_len, //记录长度
hash_func_t  pfn_hash   //哈希函数
                 );
//添加一条记录时，需要指定关键字信息和记录值信息。
/// 用于向已经初始化的哈希表中添加一条记录，添加一条记录时，需要指定关键字信息和记录值信息。
/// @param p_hash 指向哈希表实例的指针
/// @param key  指向关键字的指针
/// @param value 指向记录值得指针 由于添加记录时程序不会修改key和value指针所指向的值，所以指针都加了const修饰符
int hash_db_add(hash_db_t *p_hash,void *key,const void *value);     //添加记录
int hash_db_search(hash_db_t *p_hash,const void *ket,void *value);  //删除记录
int hash_db_del(hash_db_t *p_hash,const void *key);                 //查找记录
int hash_db_deinit(hash_db_t *p_hash);                              //解初始化
#endif /* hashdb_h */
